package day4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

//反射测试方法
public class TestMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取类对象
        Class c = Class.forName("day4.Person");
        //2.获取方法
        Method[] ms = c.getDeclaredMethods();
        for (Method m : ms){
            String name = m.getName();
            Class[] cs = m.getParameterTypes();
            Class result = m.getReturnType();
            System.out.println("方法："+name+"，参数："+ Arrays.toString(cs) +"，返回："+result);
        }
        //获取一个方法 然后进行调用
        //c.getDeclaredMethod(方法名，可变长的方法的参数);
        //test();
        //test("aa");
        //test("a",10,false);
        Method m1 = c.getDeclaredMethod("test1");
        Method m2 = c.getDeclaredMethod("test2",String.class,Integer.class);
        Method m3 = c.getDeclaredMethod("test3",int.class,int.class);
        m2.setAccessible(true);//开启私有权限
        //调用方法 m1.invoke(对象，方法调用的实参)
        Person p = new Person(10);
        Object value1 = m1.invoke(p);
        Object value2 = m2.invoke(p, "姓名", 18);
        Object value3 = m3.invoke(p, 10, 20);
        System.out.println(value1+" "+value2+" "+value3);
    }
    //如果方法的参数 个数不确定(0-n个参数)
    //如果类型也不确定 可以定义Object
    //String ... a 表示可变长参数(本质上就是数组)
    public static void test(Object ... a){
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}
